package com.atguigu;

import org.junit.Test;

/**
 * 运算符之五：位运算符(了解)
 *     结论：
 *          1.位运算符操作的都是整型的数据
 *          2.<<:在一定范围内，每向左移1位，相当于 * 2
 *            >>:在一定范围内，每向右移1位，相当于 / 2
 *
 *
 * 面试题：最高效的方式计算 2 * 8 ？ 2 << 3 或者 8 << 1
 * @author : leimingchao
 * @date Date : 2021年07月17日 13:42
 */
public class BitTest {
    public static void main(String[] args) {
        int i = 21;
        System.out.println("i << 2 :" + (i << 2));
        System.out.println("i << 3 :" + (i << 3));
        System.out.println("i << 26 :" + (i << 26));
        System.out.println("i << 27 :" + (i << 27));
        System.out.println("*********************");
        i = -21;
        System.out.println("i << 2 :" + (i << 2));
        System.out.println("i << 3 :" + (i << 3));
        System.out.println("i << 26 :" + (i << 26));
        System.out.println("i << 27 :" + (i << 27));
        System.out.println("******************************");
        int m = 12;
        int n = 5;
        System.out.println("m & n :" + (m & n));
        System.out.println("m | n :" + (m | n));
        System.out.println("m ^ n :" + (m ^ n));
        System.out.println("~ m :" + (~ m));
        System.out.println("*******************");
        //练习：交换2个变量的值
        int num1 = 10;
        int num2 = 20;
        System.out.println("num1 = " + num1 + ",num2 = " + num2 );

        //方式一：定义临时变量
        //推荐的方式
        // int temp = num1;
        // num1 = num2;
        // num2 = temp;
        //方式二：好处：不用定义临时变量
        //弊端：①相加操作可能超出存储范围 ②有局限性：只能适用于数值类型
        // num1 = num1 + num2;
        // num2 = num1 - num2;
        // num1 = num1 - num2;

        //方式三：适用位运算符
        //有局限性：只能适用于数值类型
        num2 = (num1 ^ num2) ^ num2;
        num1 = (num2 ^ num1) ^ num1;

        System.out.println("num1 = " + num1 + ",num2 = " + num2 );

    }

    @Test
    public void test() {
        char i = 2 + 'A';
        System.out.println(i);
        char j = 65 + 2;
        System.out.println(j);
    }

    @Test
    public void test2() {
        //60转换成16进制数
        int i = 60;
        //方式一：
        String str = Integer.toHexString(i);
        System.out.println(str);
        //方式二
        //获取低位
        int i2 = i & 15;
        String j = i2 > 9 ? (char)(i2 - 10 + 'A') + "" : i2 + "";

        //获取高位
        int i3 = i >>> 4;
        String k = i3 > 9 ? (char)(i3 - 10 + 'A') + "" : i3 + "";
        System.out.println(k + j);
    }
}
